﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FinanSoft.Entities;
using FinanSoft.DataLayer;
using FinanSoft.Utilities;

namespace FinanSoft.BusinessLayer
{
    class DocumentTypeManager
    {
        #region Fields
        private List<DocType> _types;
        private static DocumentTypeManager _instance;
        private bool _isError;
        private String _errorMessage;
        private bool _definiteError;
        #endregion

        #region Properties
        /// <summary>
        /// Boolean que determina si ha ocurrido algún error en la ejecución de los métodos de la clase
        /// </summary>
        public bool IsError
        {
            get
            {
                bool tempError = _isError;
                if (!_definiteError)
                    _isError = false;
                return tempError;
            }
        }

        /// <summary>
        ///  Boolean que determina si ha ocurrido algún error terminal en la ejecución de los métodos de la clase
        /// </summary>
        public String ErrorMessage
        {
            get
            {
                String tempError = _errorMessage;
                if (!_definiteError)
                {
                    _isError = false;
                    _errorMessage = "";
                }
                return tempError;
            }
        }

        /// <summary>
        /// Lista con todos los tipos de documento registrados
        /// </summary>
        public List<DocType> Types
        {
            get
            {
                return _types;
            }
        }

        #endregion

        #region Constructors

        /// <summary>
        /// Constructor por defecto de la clase. Privado para limitar las posibilidades de instanciación
        /// </summary>
        private DocumentTypeManager()
        {
            _types = new List<DocType>();
            _isError = _definiteError = false;
            _types = DocumentTypeDataManager.GetInstance().GetDocumentTypes();
            if (_types == null)
            {
                _isError = true;
                _errorMessage = Constants.ERROR_DB_CONNECTION;
            }
            _definiteError = _isError;
        }

        #endregion

        #region Methods

        /// <summary>
        /// Metodo que obtienen la instancia existente de la clase. Si esta aun no ha sido instanciada, la instancia.
        /// </summary>
        public static DocumentTypeManager GetInstance()
        {
            if (_instance == null)
                _instance = new DocumentTypeManager();
            return _instance;
        }

        /// <summary>
        /// Incrementa el número consecutivo de un tipo de documento
        /// </summary>
        /// <param name="docTypeName"></param>
        /// <returns></returns>
        public bool IncreaseDocumentConsecutiveNumber(string docTypeName)
        {
            bool result = DocumentTypeDataManager.GetInstance().IncreaseDocumentConsecutiveNumber(docTypeName);
            if (result)
                GetType(docTypeName).CurrentNumber++;
            return result;
        }

        /// <summary>
        /// Metodo que obtiene un tipo de documento
        /// </summary>
        /// <param name="Id"> String que identifica de manera unica el tipo de documento por obtener</param>
        /// <returns> El objeto tipo de documento que corresponde a la Id proporcionada o nulo en caso de que no exista</returns>
        public DocType GetType(String Name)
        {
            foreach (DocType docType in this._types)
            {
                if (docType.Name == Name)
                    return docType;
            }

            return null;
        }

        /// <summary>
        /// Metodo que obtiene un tipo de documento
        /// </summary>
        /// <param name="Id"> Entero que identifica de manera unica el tipo de documento por obtener</param>
        /// <returns> El objeto tipo de documento que corresponde a la Id proporcionada o nulo en caso de que no exista</returns>
        public DocType GetType(int Id)
        {
            foreach (DocType docType in this._types)
            {
                if (docType.Id == Id)
                    return docType;
            }

            return null;
        }

        /// <summary>
        /// Método que obtinene la lista de tipos de documentos
        /// </summary>
        /// <returns></returns>
        public List<DocType> GetDocTypes()
        {
            if (this._types.Count == 0)
            {
                _isError = true;
                _errorMessage = Constants.ERROR_NO_DOCTYPE_LIST;
            }

            return this._types;
        }
        #endregion
    }
}
